package com.vonzhou.springinaction.messaging;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import java.math.BigDecimal;

/**
 * 使用JMS模版
 * 针对如何消除冗长和重复的JMS代码，Spring给出的解决方案是JmsTemplate。JmsTemplate可以创建连接、获得会话以及发送和接收消息。这使得我们可以专注于构建要发送的消息或者处理接收到的消息。
 */
public class Sender {
	public static void main(String[] args) throws Exception {
		//This class is not trusted to be serialized as ObjectMessage payload. 使用ObjectMessage的时候需要设置信任的package

		//简单起见设置为：System.setProperty("org.apache.activemq.SERIALIZABLE_PACKAGES","*");

		System.setProperty("org.apache.activemq.SERIALIZABLE_PACKAGES", "*");

		ApplicationContext context = new ClassPathXmlApplicationContext("sender-context.xml");


		JmsTemplate template = (JmsTemplate) context.getBean("jmsTemplate");
		Destination queue = (Destination) context.getBean("queue");

//		当调用send()方法时，JmsTemplate将负责获得JMS连接、会话并代表发送者发送消息（如图17.5所示）。

//		我们使用MessageCreator来构造消息。在MessageCreator的createMessage()方法中，我们通过session创建了一个对象消息：传入一个Spittle对象，返回一个对象消息。
		template.send(queue, new MessageCreator() {
			@Override
			public Message createMessage(Session session)
					throws JMSException {
				Book book = new Book("Spring in Action", "Craig Walls", new BigDecimal(34.95));

				Message message = session.createObjectMessage(book);
				return message;
			}
		});
	}
}
